<?php

/**
 *    支付网关通知接口
 *
 *    @author    Garbin
 *    @usage    none
 */
class PaynotifyApp extends MallbaseApp {

    /**
     *    支付完成后返回的URL，在此只进行提示，不对订单进行任何修改操作,这里不严格验证，不改变订单状态
     *
     *    @author    Garbin
     *    @return    void
     */
    function index() {
        //这里是支付宝，财付通等当订单状态改变时的通知地址
        $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0; //哪个订单
        if (!$order_id) {
            /* 无效的通知请求 */
            $this->show_warning('forbidden');

            return;
        }

        /* 获取订单信息 */
        $model_order = & m('order');
        $order_info = $model_order->get($order_id);
        if (empty($order_info)) {
            /* 没有该订单 */
            $this->show_warning('forbidden');

            return;
        }

        $model_payment = & m('payment');
        $payment_info = $model_payment->get("payment_code='{$order_info['payment_code']}' AND store_id={$order_info['seller_id']}");
        if (empty($payment_info)) {
            /* 没有指定的支付方式 */
            $this->show_warning('no_such_payment');

            return;
        }

        /* 调用相应的支付方式 */
        $payment = $this->_get_payment($order_info['payment_code'], $payment_info);
        /* 获取验证结果 */
        $notify_result = $payment->verify_return($order_info);
        if ($notify_result === false) {
            /* 支付失败 */
            $this->show_warning($payment->get_error());

            return;
        }

        #TODO 临时在此也改变订单状态为方便调试，实际发布时应把此段去掉，订单状态的改变以notify为准
        //$this->_change_order_status($order_id, $order_info['extension'], $notify_result);

        /* 只有支付时会使用到return_url，所以这里显示的信息是支付成功的提示信息 */
        $this->_curlocal(LANG::get('pay_successed'));
        $this->assign('order', $order_info);
        $this->assign('payment', $payment_info);
        $this->display('paynotify.index.html');
    }

    /**
     * 支付宝异步通知
     */
    function notifyalipay() {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayalipay', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify();

        //返回验证成功
        if ($notify_result['trade_status']) {
            $this->_change_status($notify_result);
        }
        exit;

        if ($notify_result === false) {
            /* 支付失败 */
            $payment->verify_result(false);
            return;
        }

        //改变订单状态
        $this->_change_order_status($order_id, $order_info['extension'], $notify_result);
        $payment->verify_result(true);


    }
    function notifyunionpay()
    {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayunionpay', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify();
        //返回验证成功
        if ($notify_result['trade_status']) {
            $this->_change_status($notify_result);
        }
        exit;
    }
    /**
     * 微信通知
     */
    function notifyalipaywap() {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayalipaywap', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify();
        //返回验证成功
        if ($notify_result['trade_status']) {
            $this->_change_status($notify_result);
        }
        exit;
    }
    function returnalipaywap()
    {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayalipaywap', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_return();
    }
    /**
     * 微信通知
     */
    function notifywx() {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epaywxnative', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify();
        //返回验证成功
        if ($notify_result['trade_status']) {
            $this->_change_status($notify_result);
        }
        exit;
    }
    
    function returnwx(){
        $result = 0;
        $order_sn = $_GET['order_sn'];
        if(empty($order_sn)){
            echo $result;
            return ;
        }
        $account_log_mod = & m('account_log');
        $account_log = $account_log_mod->get("order_sn='$order_sn'");
        //如果充值成功
        if($account_log['complete'] == '1'){
            $result = '1';//表示为充值 到充值界面
            //如果是商品订单
            $mod_order = & m('order');
            $order_info = $mod_order->get('order_sn=' . $order_sn);
            if ($order_info) {
                $result = '2'; //表示为订单购买 到订单页面
            }
        }
        echo $result;
    }

    /*网银在线手机支付异步通知*/
    function notifyjdpaywap()
    {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayjdpaywap', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify();
        //返回验证成功
        if ($notify_result['trade_status']) {
            $this->_change_status($notify_result);
        }
        exit;
    }
    /*网银在线手机支付同步通知*/
    function returnjdpaywap()
    {
        $token = trim($_GET['token']);
        if ($token&&$this->visitor->get('user_id')) {
            $member_mod = &m('member');
            $member = $member_mod->edit('user_id=' . $this->visitor->get('user_id'),array('jdpaywap_token'=>$token));
        }
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayjdpaywap', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_return();
    }
    /*网银在线支付异步通知*/
    function notifyjdpay()
    {
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayjdpay', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify();
        //返回验证成功
        if ($notify_result['trade_status']) {
            $this->_change_status($notify_result);
        }
        exit;
    }
    /*网银在线手机支付同步通知*/
    function returnjdpay()
    {
        $token = trim($_GET['token']);
        if ($token&&$this->visitor->get('user_id')) {
            $member_mod = &m('member');
            $member = $member_mod->edit('user_id=' . $this->visitor->get('user_id'),array('jdpay_token'=>$token));
        }
        /* 调用相应的支付方式 */
        $payment = $this->_get_payment('epayjdpay', array());
        /* 获取验证结果 */
        $notify_result = $payment->verify_return();
    }
    
    /**
     * out_trade_no 商户订单号
     * trade_no 交易凭据单号
     * total_fee 涉及金额
     * trade_status 状态 为1 验证成功  为0 验证失败
     */
    function _change_status($notify_result) {
        extract($notify_result);
        if(empty($out_trade_no)||empty($total_fee)||empty($total_fee)){
            return;
        }

        $time = gmtime();
        $member_mod = & m('member');
        $account_log_mod = & m('account_log');
        //根据用户订单号，获取充值者的ID
        $account_log = $account_log_mod->get("money_flow = 'income' AND order_sn='$out_trade_no' AND money=".$total_fee." AND type=".ACCOUNT_TYPE_CZ);

        if (empty($account_log) || $account_log['complete'] == '1') {
            return;
        }

        $user_id = $account_log['user_id'];
        //获取用户的余额
        $member_mod->db->query('start transaction');
   
        $row_member = $member_mod->getAll('SELECT * FROM '.$member_mod->table.' WHERE user_id='.$user_id.' FOR UPDATE');
        if(!is_array($row_member) || empty($row_member)){//不存在，则结束
            //修改记录
            $edit_account_log = array(
                'add_time' => $time,
                'money' => 0,
                'complete' => 1,
                'states' => 61,
                'log_text'=>'用户不存在，其充值的'.$total_fee.'元存在平台账户中',
            );
            $account_log_mod->edit('order_sn=' . '"' . $out_trade_no . '"', $edit_account_log);
            $member_mod->db->query('rollback');
            return;
        }
        $row_member= current($row_member);
        //计算新的余额
        $old_money = $row_member['money'];
        $new_money = $old_money + $total_fee;
        $edit_money = array(
            'money' => $new_money,
        );
        
        $mysql_flag=$member_mod->edit('user_id=' . $user_id, $edit_money);
        if(!$mysql_flag){
                $member_mod->db->query('rollback');
                $ms=& ms();
                $ms->pm->send(MSG_SYSTEM, $user_id, '', '系统繁忙，订单号为'.$out_trade_no.'自动充值失败，请联系管理员手工为您的账户充值'.$total_fee.'元');
                return;
            }
        //修改记录
        $edit_account_log = array(
            'add_time' => $time,
            'money' => $total_fee,
            'complete' => 1,
            'states' => 61,
        );
        $mysql_flag=$account_log_mod->edit('order_sn=' . '"' . $out_trade_no . '"', $edit_account_log);
            if(!$mysql_flag){
                $member_mod->db->query('rollback');
                $ms=& ms();
                $ms->pm->send(MSG_SYSTEM, $user_id, '', '系统繁忙，订单号为'.$out_trade_no.'自动充值失败，请联系管理员手工为您的账户充值'.$total_fee.'元');
                return;
            }else{
                $member_mod->db->query('commit');
            }
        $order_id_array=array();
        if(!empty($account_log['orders_group'])){
            $order_id_array= explode(',', $account_log['orders_group']);
        }else{
            $account_log['order_id'] && $order_id_array=array($account_log['order_id']);
        }
        //---------------------  以下是判断  是否启用 自动付款----------------------

        $mod_order = & m('order');
      
            foreach($order_id_array as $order_id){
        //根据用户返回的 order_sn 判断是否为订单
        $order_info = $mod_order->get('order_id=' . $order_id);

        if (!empty($order_info)) {
            if(!$seller_info=$member_mod->get($order_info['seller_id'])){
                continue;
            }
            //如果存在订单号  则自动付款
$member_mod->db->query('start transaction');
            //买家扣除金额
            $buyer_data = array(
                'user_id' => $order_info['buyer_id'],
                'user_name' => $order_info['buyer_name'],
                'order_id' => $order_id,
                'order_sn ' => $order_info['order_sn'],
                'add_time' => $time,
                'type' => ACCOUNT_TYPE_BUY,
                'money_flow' => 'outlay',
                'money' => $order_info['order_amount'],
                'log_text' => '购买商品店铺:' . $order_info['seller_name'],
            );
           $mysql_flag=$member_mod->change_money($buyer_data);
            if(!$mysql_flag){
                $member_mod->db->query('rollback');
                continue;
            }
            //卖家对资金进行操作，新增记录同时把金额加入冻结资金
            $seller_data = array(
                'user_id' => $order_info['seller_id'],
                'user_name' => '',
                'order_id' => $order_id,
                'order_sn ' => $order_info['order_sn'],
                'add_time' => $time,
                'type' => ACCOUNT_TYPE_SELLER,
                'money_flow' => 'income',
                'money' => $order_info['order_amount'],
                'log_text' => '出售商品买家:'.$order_info['buyer_name'],
            );
            $mysql_flag=$member_mod->change_money($seller_data,'money_dj');
            if(!$mysql_flag){
                $member_mod->db->query('rollback');
                continue;
            }
            //更新定单状态
            $order_edit_array = array(
                'status' => 20, //20就是 待发货了
				'pay_time'=>gmtime()
            );
            $mysql_flag=$mod_order->edit($order_id, $order_edit_array);
            if(!$mysql_flag){
                $member_mod->db->query('rollback');
                continue;
            }else{
                $member_mod->db->query('commit');
            }
            
            /* 发送邮件给卖家，提醒付款成功 */
            $mail = get_mail('toseller_online_pay_success_notify', array('order' => $order_info));
            $this->_mailto($seller_info['email'], addslashes($mail['subject']), addslashes($mail['message']));
            /* 同步发送 */
            $this->_sendmail(true);
        }
        }
    }

    /**
     *    改变订单状态
     *
     *    @author    Garbin
     *    @param     int $order_id
     *    @param     string $order_type
     *    @param     array  $notify_result
     *    @return    void
     */
    function _change_order_status($order_id, $order_type, $notify_result) {
        /* 将验证结果传递给订单类型处理 */
        $order_type = & ot($order_type);
        $order_type->respond_notify($order_id, $notify_result);    //响应通知
    }

}

?>
